home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Workbench Add-On
/
Workbench Add-On - Volume 1.iso
/
BBS-Archive
/
Comm
/
AmiTCP30b2.lha
/
src
/
l
/
inet-handler
/
muldiv.h
< prev
next >
Wrap
C/C++ Source or Header
|
1994-04-05
|
3KB
|
93 lines
/*
* stripped from ixemul.library source file gnulib/common.h
*/
#ifndef _MULDIV_H_
#define _MULDIV_H_
/*
#include <exec/types.h>
#undef FLOAT
#include "types.h"
#define FLOAT SFVALUE
#define lowpart(a) ((unsigned short)a)
#define highpart(a) ((unsigned short)((a)>>16))
*/
static inline unsigned long
mulu (unsigned long u, unsigned long v)
{
register unsigned long result asm("d0");
asm volatile ("
movel %1,d0
movel %2,d1
movel d0,d2
movel d1,d3
swap d2
swap d3
mulu d1,d2
mulu d0,d3
mulu d1,d0
addw d3,d2
swap d2
clrw d2
addl d2,d0"
: "=r" (result)
: "g" (u), "g" (v)
: "d0", "d1", "d2", "d3");
return result;
}
#define divmodu(q, r, n, d) \
({ register unsigned long rq asm("d0"), rr asm("d1"); \
\
asm volatile (" \
movel %2,d0; \
movel %3,d1; \
cmpl #0xffff,d1; \
bhi full_division; \
movel d1,d3; \
swap d0; \
movew d0,d3; \
beq L12345; \
divu d1,d3; \
movew d3,d0; \
L12345: \
swap d0; \
movew d0,d3; \
divu d1,d3; \
movew d3,d0; \
swap d3; \
movew d3,d1; \
bra common_end; \
\
full_division: \
movel d1,d3; \
movel d0,d1; \
clrw d1; \
swap d1; \
swap d0; \
clrw d0; \
moveq #15,d2; \
divloop: \
addl d0,d0; \
addxl d1,d1; \
cmpl d1,d3; \
bhi L12346; \
subl d3,d1; \
addqw #1,d0; \
L12346: \
dbra d2,divloop; \
\
common_end:" \
: "=r" (rq), "=r" (rr) \
: "g" (n), "g" (d) \
: "d0", "d1", "d2", "d3"); \
q = rq; r = rr;})
#endif /* _MULDIV_H_ */